package schedule;


import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;

import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.Version;

/**
 * Represente un emploi du temps
 * @author Stanislas KOBAK / Celine BARILLERE
 *
 */
public class Schedule implements Iterable<Event>
{
	private String name;
	private Collection<Event> events;
    private CommandHistory history;
   
 	/**
 	 * Constructeur par defaut
 	 */
    public Schedule()
	{
		name = "";
		events = new LinkedList<Event>();
		history = new CommandHistory(100);
	}
   
    /** 
     * Constructeur
     * @param name Un nom d'emploi du temps
     */
    public Schedule(String name)
	{
		this.name = name;
		events = new LinkedList<Event>();
		history = new CommandHistory(100);
	}
	
    /** 
     * Constructeur
     * @param calendar Un calendrier iCal
     */
	public Schedule(Calendar calendar)
	{		
		events = new LinkedList<Event>();
		history = new CommandHistory(100);		
		
		for(Object object : calendar.getComponents("VEVENT"))
		{
			VEvent vEvent = (VEvent) object;	
			events.add(new Event(vEvent));
		}
	}
   
	/**
	 * Recupere les evenements
	 * @return une collection d'evenement
	 */
	public Collection<Event> getEvents() {
		return events;
	}

	/**
	 * Attribue les evenements a un emploi du temps
	 * @param events Une collection d'evenement
	 */
	public void setEvents(Collection<Event> events) {
		this.events = events;
	}
	
	/**
	 * Recupere le nom d'un emploi du temps
	 * @return un nom
	 */
	public String getName()
	{
		return name;
	}

	/**
	 * Specifie un nom a un emploi du temps
	 * @param name Un nom
	 */
	public void setName(String name)
	{
		this.name = name;
	}

	/**
	 * Ajoute un evenement a un emploi du temps
	 * @param event Un evenement
	 */
	public void addEvent(Event event)
	{
		events.add(event);
		history.addCommand(new AddEvent(event));
	}
	
	/**
	 * Supprime un evenement d'un emploi du temps
	 * @param event Un evenement
	 */
	public void removeEvent(Event event)
	{
		events.remove(event);
		history.addCommand(new RemoveEvent(event));
	}
	
	/**
	 * Met a jour un evenement
	 * @param oldEvent L'ancien evenement
	 * @param newEvent Le nouvel evenement
	 */
	public void updateEvent(Event oldEvent, Event newEvent)
	{
		events.remove(oldEvent);
		events.add(newEvent);
		history.addCommand(new UpdateEvent(oldEvent, newEvent));
	}
	
	/**
	 * Defait un evenement depuis l'historique
	 */
	public void undo()
	{
		history.undo(events);
	}
	
	/**
	 * Refait un evenement depuis l'historique
	 */
	public void redo()
	{
		history.redo(events);
	}
	
	/**
	 * 
	 * @return un calendrier iCal
	 */
	public Calendar toCalendar()
	{
		Calendar calendar = new Calendar();
		calendar.getProperties().add(new ProdId("-//CalDavManager 1.0//FR"));
		calendar.getProperties().add(Version.VERSION_2_0);
		
		for(Event event : events)
		{
			VEvent vEvent = event.toVEvent();
			calendar.getComponents().add(vEvent);
		}
		
		return calendar;
	}
	
	@Override
	public String toString()
	{
		return events.toString();
	}

	@Override
	public Iterator<Event> iterator()
	{
		return events.iterator();
	}
}
